package com.dospyer.jsql.trx;

import lombok.Data;

import java.util.List;

/**
 * @author : peigen
 * Date: 2021/12/9 7:58 下午
 */
@Data
public class ReadView {

    /**
     * 生成 ReadView 时当前系统中活跃的事务id列表
     */
    private List<Long> mIds;

    /**
     * 生成 ReadView 时，系统中活跃的事务中最小的事务id
     * 也就是 mIds 中最小值
     */
    private Long minTrxId;
    /**
     * 生成 ReadView 时，系统中最大的事务id+1，也就是下一个要分配的事务id
     * maxTrxId 不一定是 mIds 中最大值+1
     */
    private Long maxTrxId;

    /**
     * 当前事务的事务id
     */
    private Long creatorTrxId;

    /**
     * 当前事务对指定数据版本是否可见
     *
     * @param trxId
     * @return
     */
    public boolean isVisible(Long trxId) {
        // 如果访问的数据版本和当前事务id相同，说明是自己修改的，当前事务可见
        if (creatorTrxId == trxId) {
            return true;
        }
        // 如果比最小的事务id还小，说明是已经提交的事务修改的数据，当前事务可见
        if (trxId < minTrxId) {
            return true;
        }
        // 如果大于等于maxTrxId，说明是生成 ReadView 之后的事务修改的数据，当前事务不可见
        if (trxId >= maxTrxId) {
            return false;
        }
        // 如果是生成 ReadView 时还未提交的时候修改的数据，当前事务不可见
        if (mIds.contains(trxId)) {
            return false;
        }
        // 如果不符合以上三种情况，说明是 ReadView 时，事务已经提交了，当前事务可见。
        return true;
    }


}
